﻿Imports System.Media
Imports System.Text

Public Class ToonArtikelsForm

    ' TODO: deleteknop op navigator werkt anders dan deleteknop op Form

    Private _mainForm As Form

#Region "Public property's"

    Private _kanWijzigen As Boolean
    Public Property KanWijzigen() As Boolean
        Get
            Return _kanWijzigen
        End Get
        Set(ByVal value As Boolean)
            _kanWijzigen = value
            tsbWijzigen.Enabled = value
        End Set
    End Property

    Private _kanBewaren As Boolean
    Public Property KanBewaren() As Boolean
        Get
            Return _kanBewaren
        End Get
        Set(ByVal value As Boolean)
            _kanBewaren = value
            tsbBewaren.Enabled = value
        End Set
    End Property

    Private _kanVerwijderen As Boolean
    Public Property KanVerwijderen() As Boolean
        Get
            Return _kanVerwijderen
        End Get
        Set(ByVal value As Boolean)
            _kanVerwijderen = value
            tsbVerwijderen.Enabled = value
            BindingNavigatorDeleteItem.Enabled = value
        End Set
    End Property

#End Region

#Region "Constructors"

    Public Sub New(ByVal mainForm As Form)
        Me.InitializeComponent()
        _mainForm = mainForm
    End Sub

    Protected Overrides Sub OnLoad(ByVal e As EventArgs)
        MyBase.OnLoad(e)
        Try
            Me.ArtikelsBindingSource.DataSource = Utility.Data

            InitGrid()

            KanBewaren = False
            KanVerwijderen = False
        Catch ex As Exception
            MsgBox.ShowError("Fout tijdens het inladen van de gegevens")
            log.WriteError("ToonArtikelsForm.OnLoad", ex)
        End Try
    End Sub

#End Region

#Region "Event handling"

    Private Sub tsbSluiten_Click(ByVal sender As Object, ByVal e As EventArgs) Handles tsbSluiten.Click
        Me.Close()
    End Sub

    Protected Overrides Sub OnKeyUp(ByVal e As KeyEventArgs)
        MyBase.OnKeyUp(e)
        Select Case e.KeyCode
            Case Keys.F12
                Me.Close()
            Case Keys.F2
                If (Not KanBewaren) Then Return
                BewaarWijzigingen()
            Case Keys.F3
                If (Not KanVerwijderen) Then Return
                Verwijderen()
            Case Keys.F4
                NieuwArtikel()
            Case Keys.F5
                If (Grid1.SelectedRows.Count > 0) Then
                    BeheerArtikel(Grid1.SelectedRows(0).Index)
                End If
            Case Keys.F6
                BeheerDubbels()
            Case Keys.F10, Keys.Enter
                ZoekArtikelCriteriaControl1_Zoeken(Me, EventArgs.Empty)
        End Select
    End Sub

    Private Sub BindingNavigatorAddNewItem_Click(ByVal sender As Object, ByVal e As EventArgs) Handles BindingNavigatorAddNewItem.Click
        NieuwArtikel()
    End Sub

    Private Sub tsbBewaren_Click(ByVal sender As Object, ByVal e As EventArgs) Handles tsbBewaren.Click
        BewaarWijzigingen()
    End Sub

    Private Sub DataGridView1_SelectionChanged(ByVal sender As Object, ByVal e As EventArgs) Handles Grid1.SelectionChanged
        If (Grid1.SelectedRows.Count = 0) Then
            Me.KanVerwijderen = False
            Me.KanWijzigen = False
        Else
            Me.KanVerwijderen = True
            Me.KanWijzigen = True
        End If
    End Sub

    Protected Overrides Sub OnFormClosing(ByVal e As FormClosingEventArgs)
        MyBase.OnFormClosing(e)
        If (Utility.HasChanges(Utility.Data.Artikels)) Then
            Dim result As DialogResult = MessageBox.Show("Er zijn artikels gewijzigd. Wil je de wijzigingen bewaren?", "Bewaren", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation)
            Select Case result
                Case DialogResult.Yes
                    BewaarWijzigingen()
                Case DialogResult.Cancel
                    e.Cancel = True
                    Return
                Case DialogResult.No
                    ' annuleer de wijzigingen en laat sluiten
                    Utility.Data.Artikels.RejectChanges()
            End Select
        End If
        ' We have to dispose of the grid before the form closes to avoid possible DataErrors from the GridViewComboBoxColumn
        Me.Grid1.Dispose()
        _mainForm.BringToFront()
    End Sub

    Private Sub Grid1_DataError(ByVal sender As System.Object, ByVal e As DataGridViewDataErrorEventArgs) Handles Grid1.DataError
        MsgBox.ShowError("Ongeldige invoer. Bij een wijziging, druk Esc om de vorige waarde te herstellen")
        log.WriteError("ToonArtikelsForm.Grid1_DataError", e.Exception)
        e.Cancel = True
    End Sub

    Private Sub Grid1_CellDoubleClick(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles Grid1.CellDoubleClick
        If (e.RowIndex >= 0) Then BeheerArtikel(e.RowIndex)
    End Sub

    Private Sub tsbVerwijderen_Click(ByVal sender As Object, ByVal e As EventArgs) Handles tsbVerwijderen.Click
        Verwijderen()
    End Sub

    Private Sub tsbWijzigen_Click(ByVal sender As Object, ByVal e As EventArgs) Handles tsbWijzigen.Click
        If (Grid1.SelectedRows.Count > 0) Then
            BeheerArtikel(Grid1.SelectedRows(0).Index)
        End If
    End Sub

    Private Sub tsbDubbels_Click(ByVal sender As Object, ByVal e As EventArgs) Handles tsbDubbels.Click
        BeheerDubbels()
    End Sub

    Private Sub BindingNavigatorDeleteItem_Click(ByVal sender As Object, ByVal e As EventArgs) Handles BindingNavigatorDeleteItem.Click
        Verwijderen()
    End Sub

    Private Sub Grid1_CurrentCellDirtyStateChanged(ByVal sender As Object, ByVal e As EventArgs) Handles Grid1.CurrentCellDirtyStateChanged
        Me.KanBewaren = True
    End Sub

    Private Sub ZoekArtikelCriteriaControl1_Zoeken(ByVal sender As Object, ByVal e As EventArgs) Handles ZoekArtikelCriteriaControl1.Zoeken
        If (Me.ZoekArtikelCriteriaControl1.ValidateChildren()) Then
            Dim filter As String = Me.ZoekArtikelCriteriaControl1.ArtikelFilter()
            If filter Is Nothing Then
                ' bij lege criteria alles tonen
                Me.ArtikelsBindingSource.Filter = ""
                Return
            End If
            Me.ArtikelsBindingSource.Filter = filter
            Grid1.Focus()
        Else
            ' boodschap tonen "Geen geldige criteria ingevuld"
            Me.ArtikelsBindingSource.Filter = "1=0"
            SystemSounds.Asterisk.Play()
        End If
    End Sub

    Private Sub tsbNieuw_Click(ByVal sender As Object, ByVal e As EventArgs) Handles tsbNieuw.Click
        NieuwArtikel()
    End Sub

    Private Sub Grid1_RowsRemoved(ByVal sender As Object, ByVal e As DataGridViewRowsRemovedEventArgs) Handles Grid1.RowsRemoved
        ' nodig omdat je ook kan verwijderen door Del te drukken in de grid
        KanBewaren = Utility.HasChanges(Utility.Data.Artikels)
    End Sub

#End Region

#Region "Helperfuncties"

    Private Sub InitGrid()
        With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.Artikels.IdColumn.ColumnName, Grid1)
            .Visible = False ' Autonumber niet tonen
        End With
        With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.Artikels.OmschrijvingColumn.ColumnName, Grid1)
            .Width = 300
        End With
        With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.Artikels.VerwachteVoorraadColumn.ColumnName, Grid1)
            .HeaderText = "Voorraad"
            .ToolTipText = "Verwachte voorraad"
            .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
        End With
        With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.Artikels.PrijsColumn.ColumnName, Grid1)
            .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            .DefaultCellStyle.Format = "c"
        End With
        With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.Artikels.StatiegeldEuroColumn.ColumnName, Grid1)
            .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            .DefaultCellStyle.Format = "c"
        End With
        With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.Artikels.InkoopprijsColumn.ColumnName, Grid1)
            .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            .DefaultCellStyle.Format = "c"
        End With
        With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.Artikels.BTWColumn.ColumnName, Grid1)
            .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
        End With
    End Sub

    Private Function BewaarWijzigingen() As Integer
        Dim kanBewarenResult As Boolean ' wordt telkens false als het bewaren gelukt is
        Dim succes As Boolean = True ' als alle operaties succes = True geven, dan mag KanBewaren false worden
        ' Wijzigingen in andere tabellen kunnen gebeurd zijn door gebruik van het DubbeleBarcodesForm
        If (Utility.Data.VerkoopsDetails.GetChanges() IsNot Nothing) Then
            kanBewarenResult = True
            MyBase.Bewaar(Utility.Data.VerkoopsDetails, "verkoopsdetail(s)", kanBewarenResult)
            If (kanBewarenResult) Then succes = False
        End If
        If (Utility.Data.LeveringDetails.GetChanges() IsNot Nothing) Then
            kanBewarenResult = True
            MyBase.Bewaar(Utility.Data.LeveringDetails, "leveringdetail(s)", kanBewarenResult)
            If (kanBewarenResult) Then succes = False
        End If
        If (Utility.Data.Voorraadbewegingen.GetChanges() IsNot Nothing) Then
            kanBewarenResult = True
            MyBase.Bewaar(Utility.Data.Voorraadbewegingen, "voorraadbeweging(en)", kanBewarenResult)
            If (kanBewarenResult) Then succes = False
        End If
        If (Utility.SamengesteldeArtikels.GetChanges() IsNot Nothing) Then
            kanBewarenResult = True
            MyBase.Bewaar(Utility.SamengesteldeArtikels, "samengestelde artikel(s)", kanBewarenResult)
            If (kanBewarenResult) Then succes = False
        End If
        kanBewarenResult = True
        MyBase.Bewaar(Utility.Data.Artikels, "artikel(s)", kanBewarenResult)
        If (kanBewarenResult) Then succes = False
        If (succes) Then KanBewaren = False
    End Function

    Private Sub Verwijderen()
        Try
            If (Me.ArtikelsBindingSource.Current IsNot Nothing) Then
                Me.ArtikelsBindingSource.RemoveCurrent()
                KanBewaren = True
            End If
        Catch ex As Exception
            log.WriteError("ToonArtikelsForm.Verwijderen", ex)
        End Try
    End Sub

    Private Sub BeheerArtikel(ByVal rowIndex As Integer)
        Try
            Dim artikelsRow As ArtikelsDataSet.ArtikelsRow = Utility.GetGridDataRow(Of ArtikelsDataSet.ArtikelsRow)(Grid1, rowIndex)

            If (artikelsRow Is Nothing) Then Return ' bijvoorbeeld bij dubbelklikken op lege rij onderaan

            Dim editForm As New BeheerArtikelForm(artikelsRow.Id, BeheerArtikelForm.Context.BeheerArtikel)
            If (editForm.ShowDialog = DialogResult.OK) Then
                ' update grid gaat vanzelf
                Me.KanBewaren = Utility.Data.HasChanges()
            End If
        Catch ex As Exception
            log.WriteError("ToonArtikelsForm.BeheerArtikel", ex)
        End Try
    End Sub

    Private Sub NieuwArtikel()
        Try
            ' laat nieuw artikel toevoegen door gebruiker
            Dim insertForm As New BeheerArtikelForm()
            If (insertForm.ShowDialog = DialogResult.OK) Then
                ' lijst wordt automatisch bijgewerkt
                Me.KanBewaren = True
                ArtikelsBindingSource.Position = ArtikelsBindingSource.Find("ID", insertForm.ArtikelId)
            End If
        Catch ex As Exception
            MsgBox.ShowError("Fout tijdens het inladen van de gegevens")
            log.WriteError("ToonArtikelsForm.BindingNavigatorAddNewItem_Click", ex)
        End Try
    End Sub

    Private Sub BeheerDubbels()
        If (Utility.Data.HasChanges()) Then
            MsgBox.ShowWarning("Er zijn nog niet bewaarde wijzigingen. Sla deze eerst op")
            Return
        End If
        Me.Cursor = Cursors.WaitCursor
        Dim f As New DubbeleBarcodesForm
        f.ShowDialog()
        If (Utility.Data.HasChanges()) Then
            KanBewaren = True
        End If
        Me.Cursor = Cursors.Default
    End Sub

#End Region

End Class